<?php
namespace app\api\controller\v1;

/**
 * 短信验证码单例
 * Created by 
 * User: 
 * Date: 
 * Time: 
 */

use Aliyun\Core\Config;
use Aliyun\Core\Profile\DefaultProfile;
use Aliyun\Core\DefaultAcsClient;
use Aliyun\Api\Sms\Request\V20170525\SendSmsRequest;
use think\Cache;

require_once EXTEND_PATH.'ali/api_sdk/vendor/autoload.php';

// 加载区域结点配置
Config::load();

class ali_Sms {
    public $acsClient = '';
    /**
     * 静态变量保存全局实例
     */
   public static $_instance = null;

    /**
     * 私有构造方法
     */
   public function __construct(){}

    /**
     * 获取单例实例
     */
    public static function getInstance(){
        if(empty(self::$_instance)){
            self::$_instance = new self();
        }
        return self::$_instance;
    }

    /**
     * 发送短信验证码
     * $phone ：手机号码
     */
    public function sendSMS($phone) {

        //检查单个手机号发送验证码是否到达上限(10)
        if(Cache::get($phone . '_limit') == 10){
            return ['code'=>200,'msg'=>'该手机号发送验证码已达到上限','data'=>['status'=>3]];
        }
        //开始短信发送的发送准备
    	$accessKeyId = "LTAIwVtRFNo540yc";//参考本文档步骤2
        $accessKeySecret = "tt5xeSiP0Ql5vRHUnvX9OKdQW3vYO8";//参考本文档步骤2
        //短信API产品名（短信产品名固定，无需修改）
        // 短信API产品名
        $product = "Dysmsapi";

        // 短信API产品域名
        $domain = "dysmsapi.aliyuncs.com";

        // 暂时不支持多Region
        $region = "cn-hangzhou";

        // 服务结点
        $endPointName = "cn-hangzhou";

        // 初始化用户Profile实例
        $profile = DefaultProfile::getProfile($region, $accessKeyId, $accessKeySecret);

        // 增加服务结点
        DefaultProfile::addEndpoint($endPointName, $region, $product, $domain);

        // 初始化AcsClient用于发起请求
        $this->acsClient = new DefaultAcsClient($profile);

        // 初始化SendSmsRequest实例用于设置发送短信的参数
        $request = new SendSmsRequest();

        // 必填，设置雉短信接收号码
        $request->setPhoneNumbers($phone);

        // 必填，设置签名名称
        $request->setSignName("联萌科技");

        // 必填，设置模板CODE
        $request->setTemplateCode("SMS_137659588");

        /*这里判断缓存中是否有手机号的验证码缓存*/
        //随机数
        $random = Cache::has($phone)?Cache::get($phone):rand(100000,999999);

        //模板参数数组
        $send_info = array(
            'code' => $random,
            'product' => 'lianmengkeji',
        );
        // 可选，设置模板参数

        $request->setTemplateParam(json_encode($send_info));

        // 发起访问请求
        $acsResponse = $this->acsClient->getAcsResponse($request);
        //消息准备发送结束

        // 打印请求结果
        if(!($acsResponse->Code == "OK")){
            return ['code'=>200,'msg'=>'发送失败，' . $acsResponse->Message,'data'=>['status'=>2]];
        }
        //设置手机号码有效期为 5 分钟
        Cache::remember($phone,$random,config('ali.valid_time'));
        //手机号发送上限加一
        Cache::has($phone . '_limit')?Cache::inc($phone . '_limit'):Cache::set($phone . '_limit',1,86400);
        return ['code'=>200,'msg'=>'发送成功','data'=>['status'=>1]];
    }

    /**
     * 检查短信验证码是否失效
     * @param $phone
     * @return 返回验证码
     */
    public function checkValidPhone($phone, $code) {
        if(!$phone || !code){
            return ['code'=>200,'msg'=>'手机号或验证码为空','data'=>false];
        }
        if(Cache::get($phone) == $code)
        {
            return ['code'=>200,'msg'=>'验证码正确', 'data'=>true];
        }
        return ['code'=>200,'msg'=>'验证码错误','data'=>false];
    }

}